<?php

class Epic_File_Upload
{
	/**
     * Lưu trữ thông tin về file tải lên, nó là tương đương với $_FILES[]
     *
     * @var array
     */
    protected $_file;
    
    /**
     * Lưu trữ các phần mở rộng được phép tải lên
     *
     * @var array
     */
    protected $_allowedExtensions = null;
     
    /**
     * Lưu trữ dung lượng tối đa của file được phép tải lên (lưu dưới dạng B)
     *
     * @var int
     */
    protected $_allowedMaximum = null;
    
	/**
	 * Tên file tải lên
	 * 
	 * @var string
	 */
    protected $_fileName;
    
    /**
     * Thiết lập thông tin về file tải lên
     * 
     * @param string $fileId
     * @return void
     */
    function __construct($fileId)
    {
   		if (isset($_FILES[$fileId])) {
          	$this->_file = $_FILES[$fileId];
     	} else {
     		throw new Exception('$_FILES array is empty');
     	}
    }
    
    /**
     * Thiết lập các phần mở rộng được phép tải lên
     * 
     * @param array $extensions
     * @return Epic_File_Upload
     */
    public function setAllowedExtensions($extensions = array())
    {
        foreach ((array)$extensions as $extension) {
            $this->_allowedExtensions[] = strtolower($extension);
        }
        return $this;
    }
    
    /**
     * Thiết lập dung lượng tối đa của file được phép tải lên
     *
     * @param int $maxSize tham số đưa vào là KB sẽ lưu dứoi dang B
     * @return Epic_File_Upload
     */
    public function setAllowedMaximum($maxSize) 
    {
        $this->_allowedMaximum = (int)$maxSize*1024;
        return $this;
    }
    
	/**
	 * Trả lại tên file tải lên
	 * 
	 * @return string
	 */
    public function getFileName() 
    {
        return $this->_fileName;
    }
    
    /**
     * Kiểm tra xem phần mở rộng của file có hợp lệ không
     * 
     * @param string $extension
     * @return boolean
     */
    public function chechAllowedExtension($extension)
    {
        if (is_null($this->_allowedExtensions)) {
            return true;
        }
        
       	// Kiểm tra đuôi file có đúng định dạng
		if (!in_array(strtolower($extension), $this->_allowedExtensions)) {
            return false;
        }
    	
    	// Nếu file upload là các kiểu ảnh thông dụng ảnh
    	if (in_array(strtolower($extension), array('gif','jpg','jpeg','png'))) {
    		// Kiểm tra thêm kiểu định dạng file
    		if ($this->_file['type'] != "image/gif" && $this->_file['type'] != "image/jpg"
    		&& $this->_file['type'] != "image/jpeg" && $this->_file['type'] != "image/png") {
    			return false;
    		}
			// Kiểm tra nội dung file là ảnh
			if (!getimagesize($this->_file['tmp_name'])) {
				return false;
			}
    	}
		return true;
    }
    
    /**
     * Kiểm tra xem dung lượng của file có hợp lệ không
     * 
     * @param int $fileSize
     * @return boolean
     */
    public function chechAllowedMaximum($fileSize)
    {
        if (is_null($this->_allowedMaximum)) {
            return true;
        } else if ($fileSize > 0 && $fileSize <= $this->_allowedMaximum) {
			return true;
        }
        return false;
    }
    

    /**
     * Tải file lên
     * 
     * @param string $destinationFolder		Thư mục lưu trữ file tải lên
     * @param string $newFileName			Tên file được chuyển khi tải lên
     * @return boolean
     */
	public function save($destinationFolder, $newFileName = null)
    {    	
    	// Thiết lập tên cho file
    	$this->_fileName = (isset($newFileName)) ? $newFileName : str_replace(' ', '_', $this->_file['name']);
    	
        // Nếu tên file cần tải lên đã tồn tại, cần đổi tên nó
		if (file_exists($destinationFolder . '/' . $this->getFileName())) {
			$this->_fileName = date('Y-m-d-His') . $this->getFileName();
		}
		$destFile = $destinationFolder . '/' . $this->getFileName();
		
    	// Đảm bảo không có lỗi khi tải file
        if ($this->_file['error'] != 0) {
           	if ($this->_file['error'] == 4) {
	        	return $result = 'Bạn chưa chọn file.';
	        } else {
	        	return $result = 'Xảy ra lỗi khi tải file.';
	        }
        }
        
        // Kiểm tra xem phần mở rộng của file có hợp lệ không
        $fileExtension = substr($this->getFileName(), strrpos($this->getFileName(), '.')+1);
        if (!$this->chechAllowedExtension($fileExtension)) {
            return $result = 'Kiểu file không nằm trong định dạng cho phép.';
        }
        
         // Kiểm tra xem dung lượng của file có hợp lệ không
        if (!$this->chechAllowedMaximum($this->_file['size'])) {
			$max = number_format($this->_allowedMaximum/1024, 1) . 'KB'; // convert the maximum size to KB
            return $result = 'File vượt qua dung lượng cho phép là: ' . $max . 'KB';
        }
   
		// Tạo thư mục nếu chưa tồn tại thư mục để upload
		if (!is_dir($destinationFolder)) {
			mkdir($destinationFolder);
		}
		
		// Chuyển file lên thư mục cần upload
		if (move_uploaded_file($this->_file['tmp_name'], $destFile)) {
			return $result = true;
		} else {
			return $result = 'Xảy ra lỗi khi đang di chuyển file lên thư mục.';
		}
    }
}
